<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Resize Avisynth Filter</title>
<link rel="stylesheet" type="text/css" href="../../avisynth.css">
</head>
<body>
<h2>BicubicResize / BilinearResize / LanczosResize / Lanczos4Resize / PointResize</h2>
<p><code>BicubicResize </code>(<var>clip, int target_width, int target_height, float
  &quot;b&quot;, float &quot;c&quot;</var>)<br>
  <code>BilinearResize </code>(<var>clip, int target_width, int target_height</var>)<br>
  <code>LanczosResize </code>(<var>clip, int target_width, int target_height,
int &quot;taps&quot;</var>)<br>
  <code>Lanczos4Resize </code>(<var>clip, int target_width, int target_height</var>)<br>
<code>Spline16Resize </code>(<var>clip, int target_width, int target_height</var>)<br>
<code>Spline36Resize </code>(<var>clip, int target_width, int target_height</var>)<br>
<code>GaussResize </code>(<var>clip, int target_width, int target_height, float
&quot;p&quot;</var>)<br>
  <code>PointResize </code>(<var>clip, int target_width, int target_height</var>)</p>
<p><code>BicubicResize </code>(<var>clip, int target_width, int target_height, float
  &quot;b&quot;, float &quot;c&quot;, float &quot;src_left&quot;, float &quot;src_top&quot;,
  float &quot;src_width&quot;, float &quot;src_height&quot;</var>)<br>
  <code>BilinearResize </code>(<var>clip, int target_width, int target_height, float
  &quot;src_left&quot;, float &quot;src_top&quot;, float &quot;src_width&quot;,
  float &quot;src_height&quot;, int &quot;taps&quot;</var>)<br>
  <code>LanczosResize </code>(<var>clip, int target_width, int target_height, float
  "src_left", float "src_top", float "src_width", float "src_height"</var>)<br>
<code>Lanczos4Resize </code>(<var>clip, int target_width, int target_height, float
  "src_left", float "src_top", float "src_width", float "src_height"</var>)<br>
<code>Spline16Resize </code>(<var>clip, int target_width, int target_height, float
  "src_left", float "src_top", float "src_width", float "src_height"</var>)<br>
<code>Spline36Resize </code>(<var>clip, int target_width, int target_height, float
  "src_left", float "src_top", float "src_width", float "src_height"</var>)<br>
<code>GaussResize </code>(<var>clip, int target_width, int target_height, float
  "src_left", float "src_top", float "src_width", float "src_height"</var>)<br>
  <code>PointResize </code>(<var>clip, int target_width, int target_height, float "src_left",
  float "src_top", float "src_width", float "src_height", float &quot;p&quot;</var>)</p>
<p>From <em>v2.56</em> you can use offsets (as in <a href="crop.htm">Crop</a>) for all resizers:</p>
<p>
<code>GaussResize </code>(<var>clip, int target_width, int target_height, float
  "src_left", float "src_top", float -&quot;src_right&quot;, float
-&quot;src_top&quot;</var>)</p>
<p>For all resizes you can use an expanded syntax which crops before resizing.
  The same operations are performed as if you put a Crop before the Resize, there
  can be a slight speed difference.</p>
      <pre>Crop(10,10,200,300).BilinearResize(100,150)

# which is the same as
BilinearResize(100,150,10,10,200,300)</pre>

<p>Important: AviSynth has completely seperate vertical and horizontal resizers.
  If the input is the same as the output on one axis, that resizer will be skipped. <br>
  Which one is called first, is determined by which one has the smallest downscale
  ratio. This is done to preserve maximum quality, so the 2nd resizer has the
  best possible picture to work with.</p>
<h3>BilinearResize
</h3>
<p>The <code>BilinearResize</code> filter rescales the input video frames to an arbitrary
  new resolution. If you supply the optional <var>source</var> arguments, the result
  is the same as if you had applied <code><a href="crop.htm">Crop</a></code> with those arguments to the
  clip before <code>BilinearResize</code> (except faster). </p>
<p><code>BilinearResize</code> uses standard bilinear filtering and is almost identical
  to VirtualDub's "precise bilinear" resizing option. It's only "almost" because
  VirtualDub's filter seems to get the scaling factor slightly wrong, with the
  result that pixels at the top and right of the image get either clipped or duplicated.
  (This error is noticeable when expanding the frame size by a factor or two or
  more, but insignificant otherwise, so I wouldn't worry too much about it.) </p>
      <pre>Examples:
# Load a video file and resize it to 240x180 (from whatever it was before)
AVISource(&quot;video.avi&quot;).BilinearResize(240,180)

# Load a 720x480 (CCIR601) video and resize it to 352x240 (VCD),
# preserving the correct aspect ratio
AVISource(&quot;dv.avi&quot;).BilinearResize(352, 240, 8, 0, 704, 480)

# or what is the same
AviSource(&quot;dv.avi&quot;).BilinearResize(352, 240, 8, 0, -8, -0)

# Extract the upper-right quadrant of a 320x240 video and zoom it
# to fill the whole frame
BilinearResize(320,240,160,0,160,120)
</pre>

<h3>BicubicResize
</h3>
<p><tt><code>BicubicResize</code></tt> is similar to <tt><code>BilinearResize</code></tt>, except that instead
  of a linear filtering function it uses the Mitchell-Netravali two-part cubic.
  <br>
  The parameters <i>b</i> and <i>c</i> can be used to adjust the properties of
  the cubic, they are sometimes referred to as `blurring' and `ringing,' respectively.</p>
<p>With <i>b</i> = 0 and <i>c</i> = 0.75 the filter is exactly the same as VirtualDub's
  "precise bicubic," and the results are identical except for the VirtualDub scaling
  problem mentioned above. The default is <i>b</i> = 1/3 and <i>c</i> = 1/3, which
  were the values recommended by Mitchell and Netravali as yielding the most visually
  pleasing results in subjective tests of human beings. Larger values of <i>b</i>
  and <i>c</i> can produce interesting op-art effects--for example, try <i>b</i>
  = 0 and <i>c</i> = -5. </p>
<p>If you are magnifying your video, you will get much better-looking results
  with <tt><code>BicubicResize</code></tt> than with <tt><code>BilinearResize</code></tt>. However, if you
  are shrinking it, you are probably just as well off, or even better off, with <tt><code>BilinearResize</code></tt>. Although VirtualDub's bicubic filter does produce better-looking
  images than its bilinear filter, this is mainly because the bicubic filter sharpens
  the image, not because it samples it better. Sharp images are nice to look at--until
  you try to compress them, at which point they turn nasty on you very quickly.
  The <tt><code>BicubicResize</code></tt> default doesn't sharpen nearly as much as VirtualDub's
  bicubic, but it still sharpens more than the bilinear. If you plan to encode
  your video at a low bitrate, I wouldn't be at all surprised if <tt><code>BilinearResize</code></tt>
yields better quality.</p>
<p> You have to set<br>
  b + 2 * c = 1<br>
  for the numerically most accurate filter.<br>
  This gives for b = 0 the maximum value for c = 0.5, which is the Catmull-Rom
  spline and a goog suggestion for sharpness. </p>
<p>From c&gt;0.6 the filter starts to &quot;ring&quot;. You won't get real sharpness,
  what you'll get is crispening like on a TV set.<br>
  No negative values are allowed for b. Then stay on b=0. </p>
<h3>LanczosResize / Lanczos4Resize
</h3>
<p><tt><code>LanczosResize</code></tt> is an alternative to <tt><code>BicubicResize</code></tt>
with high
  values of c about 0.6 ... 0.75 which produces quite strong sharpening.<br>
  It usually offers better quality (fewer artifacts) and a sharp image.</p>
<p><code>Lanczos4Resize</code> (added in <em>v2.55</em>) is closely related to <code>LanczosResize</code> (correct name: Lanczos3Resize). The latter uses 2*3=6 lobes and the former 2*4=8 lobes to do the resizing. The result is that
<code>Lanczos4Resize</code>  produces sharper images. Especially usefull when upsizing a clip.</p>
<h4>Interpolation Tap Size (taps parameter)</h4>
<p>
"For upsampling (making the image larger), the filter is sized such that the entire equation falls across 4 input samples, making it a 4-tap filter. It doesn't matter how big the output image is going to be - it's still just 4 taps. For downsampling (making the image smaller), the equation is sized so it will fall across 4 *destination* samples, which obviously are spaced at wider intervals than the source samples. So for downsampling by a factor of 2 (making the image half as big), the filter covers 2*4=8 input samples, and thus 8 taps. For 3x downsampling, you need 3*4=12 taps, and so forth.<br>
<br>
Thus the total number of taps you need for downsampling is the downsampling ratio times the number of lobes (thus
<b>T</b>x downsampling and Lanczos<b>k</b>Resize results in T*2*k taps). And practically, one needs to round that up to the next even integer. For upsampling, it's always 4 taps." Source:
[<a href="http://www.avsforum.com/avs-vb/showthread.php?s=&amp;postid=4760581#post4760581">avsforum
post</a>].</p>
<p>Lanczos4Resize is a short hand for LanczosResize(taps=4).</p>
<h3>Spline16Resize/Spline36Resize</h3>
<p>Two spline based resizers. <code>Spline16Resize </code> is slightly faster than
<code>Spline36Resize</code>.&nbsp; (added in <em>v2.56</em>)</p>
<h3>GaussResize</h3>
<p>Uses a gaussian resizer with adjustable sharpness parameter <var>p</var>
(default 30). <var>p</var> has a range from about 1 to 100, with 1 being very blurry and 100 being very
sharp.
<code>GaussResize</code> has similar speed as <code>Lanczos4Resize</code>. (added in <em>v2.56</em>)</p>
<h3>PointResize
</h3>
<p><tt><code>PointResize</code></tt> is the simplest resizer possible. It uses a Point Sampler
  or Nearest Neighbour algorithm, which usually results in a very blocky image.
  So in general this filter should only be used, if you intend to have inferiour
  quality, or you need the clear pixel drawings.<br>
  Useful for magnifying small areas for examination. </p>
<p><b>Changelog:</b></p>
<table border="1">
  <tbody>
    <tr>
      <td>v2.55</td>
      <td>added Lanczos4Resize</td>
    </tr>
    <tr>
      <td>v2.56</td>
      <td>added Spline16Resize, Spline36Resize, GaussResize and taps parameter in LanczosResize; added offsets in Crop part of xxxResize</td>
    </tr>
  </tbody>
</table>
<p><kbd>$Date: 2005/10/03 16:49:04 $</kbd></p>
<FORM>
  <INPUT TYPE="Button" VALUE="Back"
onClick="history.go(-1)">
</form>
</body>
</html>
